package cn.ware.house.interfaces.service.productservice.impl;

import cn.ware.house.interfaces.entity.goods.Product;
import cn.ware.house.interfaces.entity.goods.ProductStyle;
import cn.ware.house.interfaces.mapper.prodctmapper.ProductMapper;
import cn.ware.house.interfaces.service.productservice.ProductService;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.List;

/**
 * 商品服务接口的实现类，实现了商品业务逻辑操作的具体方法，
 * 通过调用商品数据访问层（ProductMapper）的方法来与数据库进行交互，
 * 完成如查询、插入、更新、删除等业务功能。
 */
@Service
public class ProductServiceImpl implements ProductService {

    @Resource
    private ProductMapper productMapper;

    @Override
    public List<Product> findProductsByPage(int page, int size) {
        int offset = (page - 1) * size;
        return productMapper.selectProductsByPage(offset, size);
    }

    @Override
    public Product findProductById(Integer productId) {
        return productMapper.selectProductById(productId);
    }

    @Override
    public boolean insertProduct(Product product) {
        int rows = productMapper.insertProduct(product);
        int insertRows=-1;
        // 再插入新的样式记录
        if (product.getStyles()!=null&&product.getStyles().size()>0)
            insertRows = productMapper.updateProductStylesById(product.getProductId(), product.getStyles());

        return rows > 0&&insertRows>=0;
    }

    /**
     * 更新商品信息，通过商品ID来确定要更新的商品。
     * 同时更新商品的样式信息以及分类信息
     * 由于涉及三张数据库表所以后续需要添加事务操作
     * @param product 要更新的商品对象
     * @return 更新成功返回true，否则返回false。
     */
    @Override
    public boolean updateProductById(Product product) {

        int rows = productMapper.updateProductById(product);
        // 先删除原有的样式记录
        int deleteRows = productMapper.deleteProductStylesById(product.getProductId());
        if (deleteRows < 0) {
            return false; // 如果删除操作失败，直接返回false
        }
        // 再插入新的样式记录
        int insertRows = productMapper.updateProductStylesById(product.getProductId(), product.getStyles());
        return rows > 0;

    }
    @Override
    public boolean deleteProductById(Integer productId) {
        int rows = productMapper.deleteProductById(productId);
        int deleteRows = productMapper.deleteProductStylesById(productId);
        return rows > 0;
    }

    @Override
    public int getProductTotalCount() {
        return productMapper.countProducts();
    }


    @Override
    public List<ProductStyle> getProductStylesByProductId(Integer productId) {
        return productMapper.selectStylesByProductId(productId);
    }
}